---
sidebar_position: 3
---

# Подготовка проекта к обработке в конвейере CI/CD

## Компиляция Python

:::info

Основано на статье ["Компиляция Python"](https://3-info.ru/post/33495).

:::

В нашем рабочем процессе мы захотим собирать бинарники. Так и сделаем это с помощью PyInstaller.

[PyInstaller](https://pyinstaller.org/en/stable/index.html) упаковывает приложения Python в автономные исполняемые файлы в Windows, GNU / Linux, Mac OS X, FreeBSD, Solaris и AIX.

Устанавливается через pip:

```bash
pip install pyinstaller
```

После установки для создания исполняемого файла достаточно выполнить команду:

```bash
pyinstaller <имя_файла>.py
```

В результате будет создано:

- `*.spec` – файл спецификации (используется для ускорения будущих сборок приложения, связи файлов данных с приложением, для включения `.dll` и `.so` файлов, добавление в исполняемый файл параметров runtime-а Python);
- `build/` – директория с метаданными для сборки исполняемого файла;
- `dist/` – директория, содержащая все зависимости и исполняемый файл.

## Статический анализатор кода

[Pylint](https://pypi.org/project/pylint/) - это статический анализатор кода для Python 2 или 3. Последняя версия поддерживает Python 3.7.2 и выше.

Pylint анализирует ваш код, фактически не запуская его. Он проверяет наличие ошибок, применяет стандарт кодирования, ищет запахи кода и может вносить предложения о том, как можно реорганизовать код.

Для использования из командной строки pylint устанавливается с:

```bash
pip install pylint
```

Запустить тестирование кода можно следующим образом:

```bash
pylint calculator.py
```

## pip freeze

В наших рабочих процессах нам потребуется разворачивать изолированные среды Python. А для этого необходимо знать какие пакеты должны в ней находиться. Поэтому выведем установленные пакеты в из нашего локального окружения в формате требований в текстовый документ `requirements.txt`:

```bash
pip freeze > requirements.txt
```

В `requirements.txt` (у вас может быть версии более актуальные):

```bash
altgraph==0.17.3
astroid==2.12.12
autopep8==1.7.0
dill==0.3.5.1
isort==5.10.1
lazy-object-proxy==1.7.1
macholib==1.16.2
mccabe==0.7.0
platformdirs==2.5.2
pycodestyle==2.9.1
pyinstaller==5.5
pyinstaller-hooks-contrib==2022.10
pylint==2.15.4
toml==0.10.2
tomli==2.0.1
tomlkit==0.11.5
wrapt==1.14.1
```

В итоге репозиторий выглядеть должен следующим образом:

```bash
awesome-project
├── calculator.py
├── README.md
├── .gitignore
├── calculator_tests.py
└── requirements.txt
```

:::danger

Не забудьте зафиксировать изменения и отправить их в удаленный репозиторий!

:::

![Состояние репозитория подготовки к CI](images/prepare-for-pipeline-result.png)
